package j.framework.core;

import j.data.tree.TreeData;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * User: jason
 * Date: 2014/11/7 10:26
 */
public interface MembershipProvider {
    /**
     * 从当前请求中获取已经登录过的用户信息，若没有，则返回空值(null)
     * @param request
     * @return
     */
    IAuthorization getMember(HttpServletRequest request);

    /**
     * 验证当前用户，若验证成功，则增加到请求中的session中,否则返回false
     * session中的键为:IAuthorization.SESSION_KEY
     * @param loginName
     * @param pwd 明文
     * @param request
     * @return
     */
    MemberStatus<IAuthorization> validate(String loginName, String pwd, HttpServletRequest request);

    /**
     * 判断当前登录用户是否具有role的角色，若目前没有用户登录，则返回false
     * @param role
     * @return
     */
    boolean hasRole(LoginUser user, String role);


    /**
     * 判断当前登录用户是否具有function的功能权限，若目前没有用户登录，则返回false
     * @param functionCode
     * @return
     */
    boolean hasFunction(LoginUser user, String functionCode);


    /**
     * 判断当前登录用户是否具有function模块下的action操作权限，若目前没有用户登录，则返回false
     * @param functionCode
     * @param actionCode
     * @param managedUserId 管理用户ID,若指定了,则由子类负责当当前用户若与指定用户一致时是否拥有权限
     * @return
     */
    boolean hasAction(LoginUser user, String functionCode, String actionCode, String managedUserId);
    /**
     * 判断当前登录用户是否具有function模块下的action操作权限，若目前没有用户登录，则返回false
     * @param functionCode
     * @param actionCode
     * @return
     */
    boolean hasAction(LoginUser user, String functionCode, String actionCode);

    /**
     * 获取指定功能模块下的操作列表，结果将按list中的加入顺序显示
     * @param functionCode
     * @return
     */
    List<Action> getFunctionActions(String functionCode);

    /**
     * 获取指定模块下指定操作的操作详细
     * @param functionCode
     * @param action
     * @return
     */
    Action getFunctionAction(String functionCode, String action);

    TreeData getUserFunctionTree(LoginUser user);
}
